package com.hmkj.core.service.order;

import com.hmkj.core.api.ufx.model.res.DealPush;
import com.hmkj.core.api.ufx.model.res.EntrustPush;
import com.hmkj.core.model.order.OrderModel;
import com.hmkj.core.po.order.Order;
import com.hmkj.core.service.base.GenericService;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 策略表业务相关Service接口<br>
 *
 * @author eproo
 * @ClassName: OrderService
 * @date 2017-11-07 06:58:23
 */
public interface OrderService extends GenericService<Integer, Order> {
    /**
     * 接单
     *
     * @param order
     * @param investerId
     */
    void takingOrder(Order order, Integer investerId);

    /**
     * 流单
     *
     * @param order
     */
    void flowOrder(Order order);

    /**
     * 撤单
     *
     * @param id         订单ID
     * @param userId     操作用户ID
     * @param cancleType 撤单类型
     */
    void cancelOrder(Integer id, Integer userId, Order.CANCLETYPE cancleType) throws Exception;

    /**
     * 策略委托中手动处理三方接口问题订单
     *
     * @param order
     * @param openAmount
     * @param openBusiNo
     * @param openPrice
     * @param openTime
     * @throws Exception
     */
    void ebtrustHandDealOrder(Order order, Integer openAmount, String openBusiNo, BigDecimal openPrice, Date openTime) throws Exception;

    /**
     * 策略结算中手动处理三方接口问题订单
     *
     * @param settleAmount
     * @param settleBusiNo
     * @param settlePrice
     * @param settleTime
     * @throws Exception
     */
    void balanceHandDealOrder(Order order, Integer settleAmount, String settleBusiNo, BigDecimal settlePrice, Date settleTime) throws Exception;

    /**
     * 交易汇总
     */
    List<OrderModel> userSum(String startTime, String endTime, Integer agentId);

    /**
     * 策略平仓
     *
     * @param orderId    待平仓策略ID
     * @param num        平仓数量
     * @param settleType 平仓类型
     */
    void coverOrder(int orderId, Integer num, Order.SETTLETYPE settleType) throws Exception;

    /**
     * 策略平仓
     *
     * @param order       带平仓策略
     * @param num         平仓数量
     * @param settlePrice 平仓价格
     * @param settleType  平仓类型
     */
    void coverOrderHandler(Order order, Integer num, BigDecimal settlePrice, Order.SETTLETYPE settleType) throws Exception;

    /**
     * 策略成交回报处理
     *
     * @param model 回报参数
     */
    void doDealPush(DealPush model);

    /**
     * 策略委托回报处理
     *
     * @param model 回报参数
     */
    void doEntrustPush(EntrustPush model);

    /**
     * 策略下单
     *
     * @param userId       用户ID
     * @param commoId      品种ID
     * @param num          交易数量
     * @param lostPoint    止损点数
     * @param point        积分抵扣
     * @param openWay      开仓类型
     * @param direction    交易方向
     * @param entrustPrice 委托价格（限价单使用）
     * @param resource     订单来源
     * @param follow       订单类型 1,点买单:T1;2,跟单:T2
     * @param followId     跟单操盘手ID
     * @param ip           下单IP
     */
    Integer doTrade(Integer userId, Integer commoId, Integer num, Integer lostPoint, Integer point, Integer openWay, Integer direction, BigDecimal entrustPrice, String resource, Integer follow, Integer followId, String ip) throws Exception;

    /**
     * 限价单行情驱动下单
     *
     * @param commoId 品种ID
     * @param np      最新价
     */
    void doLimitOrderTrade(Integer commoId, BigDecimal np);

    /**
     * 易盛下单
     *
     * @param orderId
     * @param ip
     * @throws Exception
     */
    void doTradeEntrust(Integer orderId, String ip) throws Exception;

    /**
     * 止盈止损平仓
     *
     * @param np        最新价
     * @param commoCode 品种代码
     */
    void doCoverByLostProfit(BigDecimal np, String commoCode);

    /**
     * 根据状态和用户id 查询
     */
    List<Order> selectByStatusUserId(Integer userId, Integer... status);
}


